/* Copyright (C) 2008, 2009, 2010 Faindu GmbH, Switzerland.
* All Rights Reserved. The following is Source Code and is subject to all restrictions 
* on such code as contained in the license accompanying this project. */
package blocstac.editimage.base
{
import blocstac.api.blocbox.MimeType;

import flash.display.BitmapData;
import flash.events.TimerEvent;
import flash.utils.Timer;

import flexunit.framework.TestCase;

public class ImageModelTest extends TestCase
{
	
    //==========================================================================
    //
    //  Test set up and tear down
    //
    //--------------------------------------------------------------------------  
	private var imageModel:ImageModel
	private var imageData:BitmapData
	private var timer:Timer
	
	override public function setUp(): void {
		imageModel = new ImageModel()
		imageData = new BitmapData(10, 15)
	}
	
	override public function tearDown():void {
	}
	
    //==========================================================================
    //
    //  Tests
    //
    //--------------------------------------------------------------------------  
	[Test]
	public function test_scale(): void {
		assertEquals(1, imageModel.editedScaleX)
		assertEquals(1, imageModel.editedScaleY)
		
		imageModel.editedScaleX = 2
		imageModel.editedScaleY = 3
		
		assertEquals(2, imageModel.editedScaleX)
		assertEquals(3, imageModel.editedScaleY)
	}

	[Test]
	public function test_mimeType(): void {
		assertTrue(imageModel.mimeType.toString() == MimeType.MIMETYPE_JPG)
		imageModel.mimeType = new MimeType(MimeType.MIMETYPE_DOC)
		assertTrue(imageModel.mimeType.toString() == MimeType.MIMETYPE_DOC)
	}

	[Test]
	public function test_imageData(): void {
		assertNull(imageModel.imageData)
		assertFalse(imageModel.imageDataChanged)
		
		imageModel.updateImageData(imageData)
		assertEquals(imageData, imageModel.imageData)
		assertTrue(imageModel.imageDataChanged)
	}

	[Test]
	public function test_resetImageDataChanged(): void {
		imageModel.updateImageData(imageData)
		assertTrue(imageModel.imageDataChanged)
		imageModel.resetImageDataChanged()
		assertFalse(imageModel.imageDataChanged)
	}

	[Test]
	public function test_bytes_for_jpg(): void {
		assertNull(imageModel.bytes)
		
		imageModel.updateImageData(imageData) //two times because this is the initial load
		imageModel.updateImageData(imageData.clone())
		timer = new Timer(200, 1)
		timer.addEventListener(TimerEvent.TIMER_COMPLETE, addAsync(test_bytes_for_jpgHandler, 300))
		timer.start()
	}
	private function test_bytes_for_jpgHandler(event:TimerEvent):void {
		assertNotNull(imageModel.bytes)
		assertEquals(687, imageModel.bytes.length)
	}

	[Test]
	public function test_bytes_for_png(): void {
		assertNull(imageModel.bytes)
		
		imageModel.mimeType = new MimeType(MimeType.MIMETYPE_PNG)
		imageModel.updateImageData(imageData) //two times because this is the initial load
		imageModel.updateImageData(imageData.clone())
		timer = new Timer(200, 1)
		timer.addEventListener(TimerEvent.TIMER_COMPLETE, addAsync(test_bytes_for_pngHandler, 300))
		timer.start()
	}
	private function test_bytes_for_pngHandler(event:TimerEvent):void {
		assertNotNull(imageModel.bytes)
		assertEquals(76, imageModel.bytes.length)
	}

	[Test]
	public function test_angle(): void {
		assertEquals(0, imageModel.angle)
		assertFalse(imageModel.angleHasChanged)
		
		imageModel.angle = 2
		
		assertEquals(2, imageModel.angle)
		assertTrue(imageModel.angleHasChanged)
		
		imageModel.angleHasChanged = false
		assertFalse(imageModel.angleHasChanged)
	}

	[Test]
	public function test_toString(): void {
		assertEquals("ImageModel(edited scale: 1*1	angle: 0)", imageModel.toString())
		
		imageModel.updateImageData(imageData)
		assertEquals("ImageModel(edited scale: 1*1	angle: 0	image: 10*15)", imageModel.toString())
	}

	[Test]
	public function test_imageModelChanged():void {
		assertFalse(imageModel.hasChanged)
		imageModel.editedScaleX = 5
		assertTrue(imageModel.hasChanged)
	}

	[Test]
	public function test_resetHasChanged():void {
		imageModel.editedScaleX = 5
		assertTrue(imageModel.hasChanged)
		imageModel.resetHasChanged()
		assertFalse(imageModel.hasChanged)
	}
}
}